package com.cskaoyan.javase.oop3._2inner._3local._0introduction;

/**
 * 在具体看各项前，仍然是先明确以下：
 *      1.局部内部类是一种比成员位置定义的内部类更加极致封装思想的体现
 *      成员内部类在成员位置，类中都是可以访问到它的。但是局部内部类一旦出了作用域等就不再生效了。
 *
 *      2. 局部内部类的使用会显著增加代码层级，导致代码可读性很变差，所以如无必要不要使用局部内部类。
 *      如果你在局部位置碰到问题，希望有一个对象能够解决问题，需要定义一个类，同时又希望该类不被外界所感知，仅在方法内部生效，就可以使用局部内部类。
 *      3.当然，局部内部类在某些时候，还能节省一些代码量，会方便一些。
 *
 * 局部内部类是定义在一个方法或者一个作用域里面的类
 * 简单来说，将局部内部类看成是局部变量即可，该类的有效范围仅在作用域内部。
 * （这意味着要创建它的对象，必须在作用域内部创建）
 *
 * 从语法和具体使用上看
 * 局部内部类和成员内部类很相似
 * 有点类似于直接把一个成员内部类放进局部位置，语法是：
 * // 局部位置
 * class Inner{
 * }
 * // 局部位置
 *
 * 局部内部类的自身特点:
 * 主要从以下几个角度分析：
 *      1.访问权限修饰符
 *          没有访问权限的概念,已经被作用域限制死了作用范围,不需要访问权限
 *          也没有static修饰
 *      2.成员特点
 *          和成员内部类一样
 *          没有static声明
 *          但是可以定义字面值常量赋值的全局常量
 *
 *      3.继承和实现
 *          如果在局部位置需要一个对象
 *          而该对象是某个类的子类对象
 *          或者某个接口的实现类对象
 *          就可以使用局部内部类来完成这个需求
 *
 * @since 09:23
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

// 外围类
class EnclosedClazz {
    // 成员方法
    public void test() {
        // 局部位置,定义局部内部类
        class InnerClazz {
            int a;
            private int b;
            // static int c;
            static final int C = 30;
            // static {}

            public InnerClazz(int a, int b) {
                this.a = a;
                this.b = b;
            }
        }
    }

    public void test2(){
        // 在局部位置,需要一个A的子类对象
        class ASon extends A{}
        ASon aSon = new ASon();
        // 在局部位置,需要一个接口IA的子类对象
        class IAImpl implements IA{}
        IAImpl ia = new IAImpl();
    }
}
class A{}
interface IA{}